package chapter07

/**
 * Created with IntelliJ IDEA.
 * ClassName: Test03_Array
 * Package: chapter07
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 *          Date: 2023-07-05
 *          Time: 20:47
 */

//不可变 数组 数组最终也是一个引用类型
//不可变只的是 应用地址 和 一开始分配的空间大小
//数组中的元素是可以改变的 可以 修改 但是不能新增 和  删除 涉及到空间地址的改变
object Test03_Array {
  def main(args: Array[String]): Unit = {
    //存放任意数据类型 指定Any (10)数组大小是10 确定之后不在变化
    val arr1:Array[Int] = new Array[Int](10)

    //2.伴生对象创建数组 Array的apply方法
    val arr2 = Array(12,23,43,45,56)

    //遍历 indices 相当于 0 until arr2.length
    //数组元素的访问是 arr() 小括号 Java是arr[]括号
    for (i <- arr2.indices) println(arr2(i))

    println("----------for增强-----------")
    //增强for循环 直接遍历元素 不关系索引
    for (elem <- arr2){
      println(elem)
    }

    println("--------迭代器循环------------")
    //迭代器循环  配合while循环使用
    val inter = arr2.iterator
    while (inter.hasNext){
      println(inter.next())
    }

    println("-------foreach循环------------")
    //foreach 循环
    arr2.foreach(println)
    //参数是一个函数 函数类型是 Int => Unit
    //匿名函数的至简原则
    //1.参数类型可以省略 会根据形参自动推导

    //2.省略类型之后只有一个参数 那么圆括号可以省略 其他情况都不能省略 两个以上或者没有参数
    //3.匿名函数只有一行 大括号可以省略
    //4.如果参数只出现一次 参数省略且后买参数可以使用_代替
    //5.如果println作为函数体 而不是调用语句 可以直接省略下滑线
    arr2.foreach((elem) => println(elem))

    //有一个约束 对于不可变结合使用 符号类型操作数组 对于可变集合 使用方法操作数组
    //元素追加
    //添加元素 生成一个新的数组 末尾追加 冒号 靠近的是引用类型
    val newArr = arr2.:+(100)
    println(newArr.mkString(","))
    //运算符本质也是方法调用 .号的方法调用可以省略 用空格隔开
    //如果只有一个参数 也可以去掉小括号 空格分开
    //: 靠近的一定是引用类型 添加到最前
    val newArr1 = 100 +: newArr
    println(newArr1.mkString(","))


  }
}
